package com.sheng.leetcode.year2022.month04.day26;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2022/04/26
 *
 * 883. 三维形体投影面积
 *
 * 在 n x n 的网格 grid 中，我们放置了一些与 x，y，z 三轴对齐的 1 x 1 x 1 立方体。
 * 每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上。
 * 现在，我们查看这些立方体在 xy 、yz 和 zx 平面上的投影。
 * 投影 就像影子，将 三维 形体映射到一个 二维 平面上。从顶部、前面和侧面看立方体时，我们会看到“影子”。
 * 返回 所有三个投影的总面积 。
 *
 * 示例 1：
 *
 * 输入：[[1,2],[3,4]]
 * 输出：17
 * 解释：这里有该形体在三个轴对齐平面上的三个投影(“阴影部分”)。
 * 示例 2:
 *
 * 输入：grid = [[2]]
 * 输出：5
 * 示例 3：
 *
 * 输入：[[1,0],[0,2]]
 * 输出：8
 *
 * 提示：
 *
 * n == grid.length == grid[i].length
 * 1 <= n <= 50
 * 0 <= grid[i][j] <= 50
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/projection-area-of-3d-shapes
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCode0883 {

    @Test
    public void test01(){
        //int[][] grid = new int[][] {{1,2},{3,4}};
        //int[][] grid = new int[][] {{2}};
        int[][] grid = new int[][] {{1,0},{0,2}};
        System.out.println(new Solution().projectionArea(grid));
    }

}
class Solution {
    public int projectionArea(int[][] grid) {
        //sum为总面积，分开求取3个面的面积
        int sum = 0;
        int n = grid.length;
        for (int i = 0; i < n; i++) {
            //求xz面的面积，以x为底线循环求
            int xmax = 0;
            //求yz面的面积，已y为底线循环求，y相等，x变化，求出数组中最大的数相加
            int ymax = 0;
            for (int j = 0; j < n; j++) {
                xmax = Math.max(xmax, grid[i][j]);
                ymax = Math.max(ymax, grid[j][i]);
                //求xy面的面积，n == grid.length == grid[i].length，不为零则加一
                if (grid[i][j] != 0) {
                    sum += 1;
                }
            }
            sum += xmax;
            sum += ymax;
        }
        return sum;
    }
}

//class Solution {
//    public int projectionArea(int[][] g) {
//        int ans1 = 0, ans2 = 0, ans3 = 0;
//        int n = g.length;
//        for (int i = 0; i < n; i++) {
//            int a = 0, b = 0;
//            for (int j = 0; j < n; j++) {
//                if (g[i][j] > 0) ans1++;
//                a = Math.max(a, g[i][j]);
//                b = Math.max(b, g[j][i]);
//            }
//            ans2 += a; ans3 += b;
//        }
//        return ans1 + ans2 + ans3;
//    }
//}
//根据题意进行模拟即可，使用三个变量分别统计三视图的阴影面积：
//
//ans1：统计俯视图的面积，共有 n * n 个位置需要被统计，当任意格子 g[i][j] > 0，阴影面积加一；
//ans2：统计左视图的面积，共有 n 行需要被统计，每一行对 ans2 的贡献为该行的最大高度；
//ans3：统计主视图的面积，共有 n 列需要被统计，每一列对 ans3 的贡献为该列的最大高度。
//
//作者：AC_OIer
//链接：https://leetcode-cn.com/problems/projection-area-of-3d-shapes/solution/by-ac_oier-r6hj/
//来源：力扣（LeetCode）
//著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
